package com.example.mybatisplus.mybatisPlusConfig;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @ClassName MyMetaObjecthandler
 * @Description
 * @Author huyingliang
 * @Date 2024-04-23 17:49
 */
/*该类的作用是：
 * 为实体类上添加了 INSERT_UPDATE 设置的类的 新增或者是更新操作做自动的属性填充*/
@Component
public class MyMetaObjecthandler implements MetaObjectHandler {


//    public Integer yn;
//    public String creator;
//    public String updater;
//    public Date createTime;
//    public Date updateTime;
    @Override
    public void insertFill(MetaObject metaObject) {
        Date now = new Date();
        /*如果对象在进行插入操作的时候，对象中的 yn 是没有值的，此时才需要给他进行默认的填充*/
        if (metaObject.getValue("yn") == null) {
            setFieldValByName("yn", 1, metaObject);
        }
        if (metaObject.getValue("creator") == null) {
            /*这里可以结合 security 的上下文来获取操作人 我这里写的简单了，就直接使用 admin 来赋值*/
            setFieldValByName("creator", "admin", metaObject);
        }
        if (metaObject.getValue("updater") == null) {
            /*这里可以结合 security 的上下文来获取操作人 我这里写的简单了，就直接使用 admin 来赋值*/
            setFieldValByName("updater", "admin", metaObject);
        }
        if (metaObject.getValue("createTime") == null) {
            setFieldValByName("createTime", now, metaObject);
        }
        if (metaObject.getValue("updateTime") == null) {
            setFieldValByName("updateTime", now, metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {

        /*更新的时候 逻辑就不太一样了 更新的前提是有一个对象，那么该对象的一些值是不能随便乱动的，
         * 就比如yn，而更新人和更新时间则可以变化*/
        if (metaObject.getValue("updater") == null) {
            /*这里可以结合 security 的上下文来获取操作人 我这里写的简单了，就直接使用 admin 来赋值*/
            setFieldValByName("updater", "admin1231231", metaObject);
        }
        if (metaObject.getValue("updateTime") == null) {
            setFieldValByName("updateTime", new Date(), metaObject);
        }
    }
}
